package com.heima.crm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.crm.annotation.AddNotice;
import com.heima.crm.common.contents.CommonMessageContent;
import com.heima.crm.common.result.PageResult;
import com.heima.crm.common.result.Result;
import com.heima.crm.common.utils.BaseContext;
import com.heima.crm.common.utils.YsRandomCodeUtils;
import com.heima.crm.enumeration.OperationType;
import com.heima.crm.mapper.TbActivityMapper;
import com.heima.crm.pojos.dtos.TbActivityDto;
import com.heima.crm.pojos.entity.TbActivity;
import com.heima.crm.service.ITbActivityService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 活动管理表 服务实现类
 * </p>
 *
 * @author MonsterSong
 * @since 2023-07-15
 */
@Service
public class TbActivityServiceImpl extends ServiceImpl<TbActivityMapper, TbActivity> implements ITbActivityService {
    // 添加活动的结束时间==》时间间隔期限
    public final static short TERUM = 1;
    //    课程折扣和课程代金券的默认类型
    public final static short DEFAULT_TYPE = 1;
    //     课程折扣
    public final static short DISCOUNT = 1;
    //    课程代金券
    public final static short VOUCHERS = 2;
    @Autowired
    private TbActivityMapper tbActivityMapper;

    /**
     * 活动管理分页查询
     *
     * @param dto
     * @return
     */
    @Override
    public Result findPage(TbActivityDto dto) {
        //        1.参数校验
        if (dto == null) {
            return Result.error(CommonMessageContent.INVALID_PARAMETER);//无效参数
        }
//        2.校验页码
        Integer page = dto.getPage();
        if (page == null || page < 0) {
            page = 1;
        }
        Integer size = dto.getSize();
        if (size == null || size < 0 || size > 100) {
            size = 10;
        }
//        3.分页
        Page<TbActivity> pageInfo = new Page<>(page, size);
        LambdaQueryWrapper<TbActivity> lqw = new LambdaQueryWrapper<>();
//        4.模糊查询
        lqw.like(StringUtils.isNotBlank(dto.getCode()), TbActivity::getCode, dto.getCode())
                .eq(dto.getChannel() != null, TbActivity::getChannel, dto.getChannel())
                .between(dto.getCreateBeginTime() != null && dto.getCreateEndTime() != null, TbActivity::getCreateTime, dto.getCreateBeginTime(), dto.getCreateEndTime())
                .between(dto.getActivityBeginTime() != null && dto.getActivityEndTime() != null, TbActivity::getBeginTime, dto.getActivityBeginTime(), dto.getActivityEndTime())
                .orderByDesc(TbActivity::getCreateTime);
        page(pageInfo, lqw);
//        5.封装数据
        PageResult<TbActivity> result = new PageResult<>(pageInfo.getTotal(), pageInfo.getRecords());
        return Result.success(result);
    }

    /**
     * 添加活动
     *
     * @param tbActivity
     * @return
     */
    @Override
    @AddNotice(OperationType.ACTIVITY)
    public Result addTbActivity(TbActivity tbActivity) {
        if (tbActivity == null) {
            return Result.error(CommonMessageContent.INVALID_PARAMETER);
        }
//        1.获取课程编码
        String string = YsRandomCodeUtils.generateRandomString();
        tbActivity.setCode(string);
        tbActivity.setCreateTime(LocalDateTime.now());
        tbActivity.setCreateUser(BaseContext.getCurrentId());
//        开始时间和结束时间（前端说创建不需要传时间）
     /*   tbActivity.setBeginTime(LocalDate.now());
        tbActivity.setEndTime(LocalDate.now().plusDays(TERUM));//过期时间加一天*/
//        2.判断活动名称不能重复
        LambdaQueryWrapper<TbActivity> lqw = new LambdaQueryWrapper<>();
//        匹配重复的数据
        LambdaQueryWrapper<TbActivity> eqName = lqw.eq(TbActivity::getName, tbActivity.getName());
//         返回的是查询到的相同名称的数据
        Long nameNum = tbActivityMapper.selectCount(eqName);
        if (nameNum > 0) {
            return Result.error(CommonMessageContent.ALREADY_EXISTS);// 数据已经存在
        }
//        防止输入错误的渠道来源或者活动类型的数据
        Long aLong = getaLong(tbActivity);
        if (aLong <= 0) {
            return Result.error("添加的渠道来源或者活动类型的数据有误！");
        }
//        3.拼接活动明细数据（晚于判断名称是否重复，因为如果先组合了数据，但最后名称重复就白拼接了）
//        3.1判断前端选择的是折扣还是代金券，保证类型的正确传递(限制type的值)
        int OneOrTwo = tbActivity.getType() == DEFAULT_TYPE ? DISCOUNT : VOUCHERS;
/*//        直接把乱传入的类型数据修改正确
        tbActivity.setType(OneOrTwo);*/
        if (OneOrTwo == DISCOUNT) {
            Float discountValue = tbActivity.getDiscount();//获取折扣值
//            拼接活动明细
            tbActivity.setActivityEtails("课程折扣" + "/" + discountValue + "折");
//            保证只能选择一个
            tbActivity.setVouchers(null);
        }
        if (OneOrTwo == VOUCHERS) {
            Integer vouchersValue = tbActivity.getVouchers();//获取代金券值
//            拼接活动明细
            tbActivity.setActivityEtails("课程代金券" + "/" + vouchersValue + "元");
//            保证只能选择一个
            tbActivity.setDiscount(null);
        }
        tbActivityMapper.insert(tbActivity);
        return Result.success("活动添加成功！");
    }

    /**
     * 活动数据回显
     *
     * @param id
     * @return
     */
    @Override
    public Result findById(Long id) {
        if (id == null) {
            return Result.error(CommonMessageContent.INVALID_PARAMETER);
        }
        TbActivity tbActivity = tbActivityMapper.selectById(id);
        return Result.success(tbActivity);
    }

    /**
     * 修改活动数据
     *
     * @param tbActivity
     * @return
     */
    @Override
    public Result updateTbActivity(TbActivity tbActivity) {
        if (tbActivity == null) {
            return Result.error(CommonMessageContent.INVALID_PARAMETER);
        }
        tbActivity.setUpdateTime(LocalDateTime.now());
        tbActivity.setUpdateUser(BaseContext.getCurrentId());
//        防止输入错误的渠道来源或者活动类型的数据
        Long aLong = getaLong(tbActivity);
        if (aLong <= 0) {
            return Result.error("修改的渠道来源或者活动类型的数据有误！");
        }
        tbActivityMapper.updateById(tbActivity);
        return Result.success("活动数据修改成功！");
    }

    /**
     * 添加合同时，根据渠道来源查询活动信息
     *
     * @param channel
     * @return
     */
    @Override
    public Result findChannelById(Long channel) {
//        此处不合理，
//        if (!(channel < 4 && channel > 0)) {
//            return Result.error(CommonMessageContent.INVALID_PARAMETER);
//        }
        LambdaQueryWrapper<TbActivity> lqw = new LambdaQueryWrapper<>();
        lqw.eq(TbActivity::getChannel, channel);
        List<TbActivity> tbActivities = tbActivityMapper.selectList(lqw);
        if (tbActivities.size() <= 0) {
            return Result.error("没有id为：《" + channel + "》的活动信息！");
        }
        return Result.success(tbActivities);
    }

    /**
     * 删除活动
     *
     * @param id
     * @return
     */
    @Override
    public Result delTbActivityById(Long id) {
        if (id == null) {
            return Result.error(CommonMessageContent.INVALID_PARAMETER);
        }
        tbActivityMapper.deleteById(id);
        return Result.success("活动删除成功！");
    }

    /**
     * 防止输入错误的渠道来源或者活动类型的数据
     *
     * @param tbActivity
     * @return
     */
    private Long getaLong(TbActivity tbActivity) {
        LambdaQueryWrapper<TbActivity> lqw = new LambdaQueryWrapper<>();
        lqw.eq(tbActivity.getChannel() != null, TbActivity::getChannel, tbActivity.getChannel())
                .eq(tbActivity.getType() != null, TbActivity::getType, tbActivity.getType());
        return tbActivityMapper.selectCount(lqw);
    }
}
